/**
 * @file    app_massage.h
 * @author  yhy
 * @brief   按摩系统头文件，基于电磁阀系统实现不同按摩模式
 * @version 1.00
 * @date    2025-07-24
 *
 * @copyright Copyright (c) 2025
 *
 * @details
 * Change Logs:
 * Date           Author       Notes
 * 2025-07-30     yhy          the first version V1.00
 * 2025-10-22     yhy          新增按摩手动控制模块，实现单独控制每个气袋 V1.01
 *
 */
#ifndef __APP_MASSAGE_H__
#define __APP_MASSAGE_H__

#include "common_config.h"
#include "inf_solenoid_valve.h"

#include <stdbool.h>
#include <stdint.h>

#define MASSAGE_VALVE_MAX_COUNT (12U)

/**
 * @brief 按摩电磁阀序号对照表
 *
 */
typedef enum
{
    MASSAGE_VALVE_IDX_1   = SOLENOID_VALVE_CH0,
    MASSAGE_VALVE_IDX_2   = SOLENOID_VALVE_CH1,
    MASSAGE_VALVE_IDX_3   = SOLENOID_VALVE_CH2,
    MASSAGE_VALVE_IDX_4   = SOLENOID_VALVE_CH3,
    MASSAGE_VALVE_IDX_5   = SOLENOID_VALVE_CH4,
    MASSAGE_VALVE_IDX_6   = SOLENOID_VALVE_CH5,
    MASSAGE_VALVE_IDX_7   = SOLENOID_VALVE_CH6,
    MASSAGE_VALVE_IDX_8   = SOLENOID_VALVE_CH7,
    MASSAGE_VALVE_IDX_9   = SOLENOID_VALVE_CH8,
    MASSAGE_VALVE_IDX_10  = SOLENOID_VALVE_CH9,
    MASSAGE_VALVE_IDX_11  = SOLENOID_VALVE_CH30,
    MASSAGE_VALVE_IDX_12  = SOLENOID_VALVE_CH31,
    MASSAGE_VALVE_IDX_MAX = MASSAGE_VALVE_MAX_COUNT,
} massage_valve_idx_e;

/**
 * @brief 按摩时间枚举
 *
 */
typedef enum
{
    MASSAGE_TIME_1        = 1U, /*!< 5分钟 */
    MASSAGE_TIME_2        = 2U, /*!< 10分钟 */
    MASSAGE_TIME_3        = 3U, /*!< 15分钟 */
    MASSAGE_TIME_RESERVE1 = 4U, /*!< 预留1 */
    MASSAGE_TIME_RESERVE2 = 5U, /*!< 预留2 */
    MASSAGE_TIME_RESERVE3 = 6U, /*!< 预留3 */
    MASSAGE_TIME_RESERVE4 = 7U, /*!< 预留4 */
    MASSAGE_TIME_MAX,
} massage_time_e;

/**
 * @brief 按摩模式枚举
 */
typedef enum
{
    MASSAGE_MODE_WAVE  = 1U, /*!< 波浪模式 */
    MASSAGE_MODE_PULSE = 2U, /*!< 脉冲模式 */
    MASSAGE_MODE_MANUAL,     /*! 手动控制模式（单个气袋控制）  */
    MASSAGE_MODE_MAX,
} massage_mode_e;

/**
 * @brief 按摩强度枚举
 */
typedef enum
{
    MASSAGE_INTENSITY_HIGH   = 1U, /*!< 高强度 */
    MASSAGE_INTENSITY_MEDIUM = 2U, /*!< 中强度 */
    MASSAGE_INTENSITY_LOW    = 3U, /*!< 低强度 */
    MASSAGE_INTENSITY_MAX,
} massage_intensity_e;

/**
 * @brief 按摩系统状态枚举
 */
typedef enum
{
    MASSAGE_STATE_STOPPED   = 0U, /*!< 停止状态 */
    MASSAGE_STATE_RUNNING   = 1U, /*!< 运行状态 */
    MASSAGE_STATE_SWITCHING = 2U, /*!< 切换状态（泄气阶段） */
} massage_state_e;

/**
 * @brief 按摩开关状态枚举
 *
 */
typedef enum
{
    MASSAGE_SWITCH_STATE_ON  = 1U, /*!< 开启 */
    MASSAGE_SWITCH_STATE_OFF = 2U, /*!< 关闭 */
} massage_switch_state_e;

/**
 * @brief 按摩手动模式
 *
 */
typedef enum
{
    MASSAGE_MANUAL_MODE_INVALID    = 0U,
    MASSAGE_MANUAL_MODE_START_HIGH = 1U,
    MASSAGE_MANUAL_MODE_START_MID  = 2U,
    MASSAGE_MANUAL_MODE_START_LOW  = 3U,
    MASSAGE_MANUAL_MODE_STOP       = 4U,
} massage_manual_mode_e;

/**
 * @brief 电磁阀组定义
 */
typedef struct
{
    massage_valve_idx_e channels[2];   /*!< 电磁阀通道，最多2个 */
    uint8_t             channel_count; /*!< 实际通道数量 */
} massage_valve_group_t;

/**
 * @brief 按摩模式配置
 */
typedef struct
{
    massage_valve_group_t *valve_groups;     /*!< 电磁阀组数组 */
    uint8_t                group_count;      /*!< 电磁阀组数量 */
    uint32_t               max_time_minutes; /*!< 最大按摩时间（分钟） */
} massage_mode_config_t;

/**
 * @brief 按摩系统控制结构体
 */
typedef struct
{
    bool                is_open;                  /*!< 系统是否开启 */
    bool                is_remember;              /*!< 是否开启记忆 */
    massage_state_e     state;                    /*!< 当前状态 */
    massage_mode_e      current_mode;             /*!< 当前按摩模式 */
    massage_intensity_e current_intensity;        /*!< 当前按摩强度 */
    uint8_t             current_group_index;      /*!< 当前电磁阀组索引 */
    uint32_t            group_timer_ms;           /*!< 当前组计时器（毫秒） */
    uint32_t            total_timer_ms;           /*!< 总按摩时间计时器（毫秒） */
    uint32_t            inflate_time_ms;          /*!< 充气时间（毫秒），根据强度确定 */
    uint32_t            deflate_time_ms;          /*!< 泄气时间（毫秒），固定600ms */
    bool                mode_change_pending;      /*!< 模式切换待处理标志 */
    bool                intensity_change_pending; /*!< 强度切换待处理标志 */
    massage_mode_e      pending_mode;             /*!< 待切换的模式 */
    massage_intensity_e pending_intensity;        /*!< 待切换的强度 */
    bool                remember_data_saved;      /*!< 记忆数据是否已保存标志 */
    massage_mode_e      last_saved_mode;          /*!< 上次保存的模式 */
    massage_intensity_e last_saved_intensity;     /*!< 上次保存的强度 */
} massage_system_t;

#pragma pack(1)
/**
 * @brief 按摩系统掉电记忆存储数据
 *
 */
typedef struct
{
    massage_mode_e      mode;      /*! 当前的按摩模式  */
    massage_intensity_e intensity; /*! 当前的按摩强度  */
} massage_remember_data_t;
#pragma pack()

extern massage_system_t massage_system;

result_e       app_massage_init(void);
result_e       app_massage_ctrl_single_valve(massage_valve_idx_e valve_idx, massage_manual_mode_e mode);
result_e       app_massage_start(massage_mode_e mode, massage_intensity_e intensity);
result_e       app_massage_stop(void);
result_e       app_massage_set_mode(massage_mode_e mode);
result_e       app_massage_set_intensity(massage_intensity_e intensity);
result_e       app_massage_set_max_time(massage_time_e time);
void           app_massage_switch(bool is_open);
void           app_massage_handle(void);
massage_time_e app_massage_get_time(void);
massage_switch_state_e app_massage_get_switch(void);
massage_mode_e         app_massage_get_current_mode(void);
massage_intensity_e    app_massage_get_current_intensity(void);
uint32_t               app_massage_get_remaining_time_seconds(void);
massage_manual_mode_e  app_massage_get_valve_status(massage_valve_idx_e idx);

#endif
